查看原文
其他

生物信息之独孤九剑——awk

2016-10-14 东方不败 基因学苑


编者按:

  在金庸武学体系的众多武功之中,独孤九剑并不是最强劲的武功,它与其他武林绝学有很大的不同,可以说是鹤立鸡群。比如乔峰的降龙十八掌,段誉的六脉神剑,张无忌的九阳神功,石破天的罗汉伏魔神功,这些神功都需要强大的内力支撑,而独孤九剑则不同,不需要内力,这点其实可以从华山派气宗与剑宗的分歧就可以看出来。独孤九剑传人风清扬属于剑宗,更注重招式,而不是像剑宗注重练气。独孤九剑分为总诀式,破剑式,破刀式,破枪式,破鞭式,破索式,破箭式,破掌式,破气式,遇到不同的场景使用关不同的招式,因此,独孤九剑更加注重问题的解决,本质上就是就是通过工具来解决问题。只要学会这九剑,就可以处理很多的问题。学习生物信息也是同样的道理,当然练好内功,掌握很好的基础是非常必要的,但是也可以学习一些小工具,解决一些实际问题。那么从这次内容开始,我们就来给大家介绍生物信息之独孤九剑。



awk是Linux系统中最强大的文本处理工具,很多需要编程才能完成的工作,其实通过awk工具就可以轻松解决。awk可以完成cut,grep,sed,join,uniq,wc等工具的一些功能,是非常强大的工具。相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切分,切开的部分再进行各种分析处理。

为什么awk功能这么强大呢,因为awk本身就是一门编程语言,所以学习awk有一定的难度,这种编程及数据操作语言的最大功能取决于你所掌握的awk技能多少。也就是刚开始可能觉得awk没多少用处,awk能够完成的工作,采用其他方法也都能完成,但是随着越来越熟悉awk的操作,就会发现,awk处理文本如此的高效,几乎可以完成所有的文本处理。

awk有三种执行方式,

第一种是awk命令行模式;

第二种是使用-f选项调用awk程序;

第三种就编程模式;

案例1:输出一个列表任意行;

awk '{print $1}' blast_m8.out  #输出blast m8 格式结果的第一行;

awk -F ":" '{print $1,$NF}' passwd.list   #通过-F修改默认分隔符为冒号,输出第一行与最后一行;


案例2:格式转换

awk '{print"@" $1"\n"$10"\n""+\n"$11""}' all.sam  #将短序列比对上的reads输出出来,生成fastq文件;


案例3:过滤blast结果

awk ’{if ($3>=80 && $4>=100) print $0}'  blast_m8.out  #过滤blast比对结果,将identity 大于80,并且比对长度大于100bp的结果输出;


案例4:比较

awk '$8>$10' input.txt #输出第8列大于第10列的行。


案例5:匹配输出

awk '$0~ /wang/{print $0}' passwd.list   #利用正则表达式,将秘密表中姓wang的账户都输出出来;


案例6:格式化输出

awk 'BEGIN{print "The Program Begin\n"}{if ($3>=80 && $4>=100) print $0}END{print " The Program End\n"}' input.txt  #利用BEGIN和END关键字生成报告;


案例7:修改字段和记录分隔符

awk 'BEGIN{OFS="\t"}{print $2,$4,$5}' input.txt   #在BEGIN中设定字段分隔符和记录分隔符;


案例8:awk编程计算

awk '{x+=$3}END{print x/NR}' input.txt   #计算第三列的平均值,最后在END将其输出出来。


案例9:awk编程比较大小

awk   'BEGIN { max=100 ;print "max=" max} {max=($1 >max ?$1:max); print $1,"Now max is "max}' input.txt  #取得文件最后一个域的最大值。 


案例10:awk编程求和

awk '{print $0,$3+$4}' input.txt  #计算第3列和第4列的和。


案例11:输出固定行内容

awk 'NR>=20&&NR<=80' input.txt  #输出第20到第80行内容。


案例12:合并文件

awk 'BEGIN{while((getline<"file1")>0)l[$1]=$0}$1 in l{print $0"\t"l[$1]}' file2  #将两个文件按列合并起来,类似jion命令的功能。


案例13:去重复

awk '!($0 in a) {a[$0];print}' input.txt  # 打印不重复的行,类似uniq的功能;

awk '!($2 in l){print;l[$2]=1}' input.txt #计算第二列内容非冗余的次数,类似于uniq的功能;


案例14:统计字符

awk '{for(i=1;i!=NF;++i)c[$i]++}END{for (x in c) print x,c[x]}' input.txt 计算每个字符出现的次数,类似wc的功能。


案例15:替换

awk '{sub(/test/, "no", $0);print}' input.txt 进行替换,类似sed的功能,


案例16:fastq转换为fasta

awk '{getline seq;getline plus;getline qual;sub("@",">",$0);print $0 "\n"seq}'  test.fastq


更多内容,请点击链接:

https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-10284985292.19.ODeefi&id=535825901642



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存